
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link href='/css/styles.css' rel='stylesheet' type='text/css' />
    <link href='/images/favicon.png' rel='shortcut icon' />
    <script src='/js/jquery.min.1.4.js'></script>
    <script src='/js/app.js'></script>
    <meta content='width=device-width, minimum-scale=1.0, maximum-scale=1.0' name='viewport' />
    <title>Redis中文资料站</title>
	<meta http-equiv="description" content="redis中文资料站，下载安装redis，查找redis常用命令（commands），选择适合的redis客户端方式，配置redis主从（master-slave），阅读redis官方文档，社区里了解更多redis信息，提交redis的bug。" />
  </head>
  <body class=''>
    <script src='/js/head.js'></script>
     <div class='text'>
      <article id='topic'>
        <h1>FAQ</h1>
        
        <h2>为什么我需要memcachedb，Tokyo Cabinet，Redis的，而不是......？</h2>
        
        <p>memcachedb基本上是memcached的持久化。Redis的是键值DBS不同的演化路径，这个想法是键 - 值区议会的主要优点是保留平原关键价值DB的舒适性，即使没有严重损失。所以Redis的提供更多的功能：</p>
        
        <ul>
        <li>键可以存储不同的数据类型，不只是字符串。值得注意的是列表和集合。
        	例如，如果你要使用不同的计算机上的每一台计算机可以作为日志存储系统Redis的<code>RPUSH data to the computer_ID&#x000A;key</code>关键数据。
        	不想每台电脑节省1000多日志行吗？刚刚发出 <code>LTRIM computer_ID 0 999</code>命令修剪后，每推名单。
        	</li>
        <li>
        另一个例子是关于集。试想一下，建立这样的社会新闻网站 <a href="http://reddit.com" target="_blank">Reddit</a>。每次用户upvotes一个给定的新闻，你可以添加到控股类型的值设置ID的用户做了upmodding news_ID_upmods关键。套也可以使用索引的事情。每个键可以拿着一套与这个标签相关联的所有对象的ID标签。使用Redis的交集，你获得这个标签的ID在同一时间列表。</li>
        <li>我们写了一个简单的<a href="http://retwis.antirez.com" target="_blank">Twitter Clone</a>只是Redis的使用数据库。从下载部分下载的源代码和想象，写一个普通的键-值数据库，不支持名单和成套... 这是 困难得多。
        </li>
        <li>多个区议会。使用SELECT命令，客户可以选择不同的数据集。这一点是非常有用的，因为Redis的移动原子原始的一个重要形式移动到另一个分贝，如果目标DB已经包含了这样一个关键，它返回一个错误：这基本上意味着一种方式来执行锁定在分布式处理。</li>
        <li>那么，什么是Redis的真正关心程序员的用户界面。再分配的目的出口到程序员合适的工具来模拟各种各样的问题。套，名单为<span class="math">O(1) </span>推送操作，lrange和LTRIM，服务器端之间的快速路口套，让复杂问题的建模与原语一个关键值数据库。
        </li>
        </ul>
        
        
        <h2>是不是这个键值的事情只是炒作吗？</h2>
        
        <p>我想象的键值议会，在短期的未来，要像你在程序中使用的内存列表，哈希等。Redis的，它是这样，但这个包含你的数据结构的内存是一种特殊的共享，原子性，持久性。</p>
        
        <p>当我们写的代码，这是显而易见的，当我们把内存中的数据，使用最明智的数据结构，工作权利？令人难以置信的是在一个关系数据库把数据时，这不再是真实的，和我们创建了一个荒谬的，即使我们需要的是把数据和在相同的顺序，我们把它里面（顺序方式得到这个数据传回的数据模型时，需要应已排序数据，奇怪的是，你不觉得吗？）。</p>
        
        <p>键 - 值区议会带来这回在家，建立合理的数据模型，并使用正确的数据结构，我们正在努力解决的问题。</p>
        
        <h2>我可以备份Redis的数据库，而服务器工作？</h2>
        
        <p>当然可以。当Redis的保存的数据库，它实际上是创建一个临时文件，然后重命名（2）临 ​​时文件名 ​​的目标文件名 ​​。因此，即使服务器是安全的保存与数据库文件CP UNIX命令。请注意您可以使用主从复制，以有数据冗余，但如果你需要的是备份上，cp或scp将做的工作非常好。</p>
        
        <h2>什么是Redis的内存占用？</h2>
        
        <p>最坏的情况：1百万的关键是自然数从0到999999和作为价值的“Hello World”字符串键上使用英特尔的MacBook（32位）100MB。需要注意的是相同的数据存储在一个独特的字符串线性像16MB的东西，这是正常的，因为小键和值有一个很大的开销。Memcached的将同样执行。
与大键/值的比例是多少当然更好。</p>
        
        <p>与大键/值的比例是多少当然更好。</p>
        
        <p>64位系统比32位系统使用更多的内存来存储相同的键，键和值，尤其是如果是小的，这是因为指针在64位系统的8个字节。但是，当然优点是，你可以有大量的内存在64位系统，所以运行大型Redis的服务器，64位系统是或多或少所需。</p>
        
        <h2>我喜欢Redis的高层次的操作和功能，但我不喜欢，它需要在内存中的一切，我不能有一个数据集较大的内存。计划改变这一点？</h2>
        
        <p>答案很简单：如果您使用的是Redis的客户端，支持一致的散列你可以分配在不同的节点集。例如Ruby客户端支持此功能。有计划开发再分配集群，基本上是一个虚拟的Redis的服务器，仅用于以分布在N个不同的节点上​​使用一致的散列请求。</p>
        
        <h2>为什么Redis的RAM中的整个数据集？</h2>
        
        <p>再分配需要在内存中的整个数据集，并以非常快异步写入磁盘上的，你有两全其美的办法：超高速和数据持久性，但付出的代价是正是这一点，该数据集必须符合您的计算机内存。</p>
        
        <p>如果数据是更大的内存，这个数据是存储在磁盘上，会发生什么是磁盘I / O速度的瓶颈，将开始破坏演出。也许没有基准，但一旦你有来自多个客户端的实际负荷与分布式密钥的访问数据必须来自磁盘，磁盘是该死的慢。不仅，但Redis的支持更高的水平比普通值的数据结构。为了实现磁盘上的这件事情是更慢。</p>
        
        <p>再分配将一如既往地继续保存在内存中的整个数据集，因为这天的可扩展性，需要使用RAM作为存储介质，内存是越来越便宜。今天，它是常见的入门级服务器，有16 GB的RAM！并在64位时代不再有限制的内存量，你可以在理论上。</p>
        
        <p>亚马逊EC2现在提供32或64 GB的RAM的实例。</p>
        
        <h2>如果我的数据集是过大的RAM，我不想使用一致的散列或其他方式分发数据集，在不同的节点，使用Redis的反正我能做些什么？</h2>
        
        <p>你可以尝试来加载1集大于你在Redis的记忆和看到发生什么事，基本上如果你是使用现代操作系统，和很多的，是很少访问数据库中的数据，操作系统的虚拟内存的实施将尝试交换很少使用的磁盘上的内存页，只记得这个网页的时候都需要。如果你有许多大的值很少使用，这将工作。如果你的数据库是大的，因为你有没有一个特定的模式在随机访问的小值吨，这将无法工作（在较低水平，一个页面通常是4096字节，你可以有不同的键/值存储在一个单一的页面。操作系统不能交换磁盘上的页面，如果有即使经常使用的几个键）。</p>
        
        <p>另一种可能的解决方案是使用MySQL和Redis的同时，基本上采取Redis的国家，所有的被访问非常频繁的事情：用户认证令牌Redis的列表，按时间顺序排列最后的ID的N-意见，氮员额，依此类推。然后用一个更大的数据，这只是创建一个大型的BLOB字段和数据字段作为主键ID自动递增表的简单的存储引擎的MySQL。访问MySQL的数据只能由主键（ID）。Redis的应用程序将运行高流量查询，但时有采取大的数据，会问MySQL的特定资源的标识。
        </p>
        
        <p>更新：它可能是有趣的测试如何Redis的执行比内存的数据集，如果这个速度非常快的英特尔SSD磁盘操作系统的交换分区。</p>
        
        <h2>你打算实施Redis的虚拟内存？为什么不只是让操作系统为您处理它呢？</h2>
        
        <p>是的，以支持更大的数据集比RAM有Redis的，那就是能力转移到磁盘上很少使用的键关联的大值，计划，实施透明的虚拟内存，并重新在内存中透明时，这个值要求以某种方式。</p>
        
        <p>所以，你可能会问，为什么不让我们的操作系统VM做的工作。主要有两个原因：在Redis的一个较大的值存储在给定的键，例如100万的元素列表，没有在一块连续的内存分配。它实际上是非常分散，因为Redis的使用相当积极的对象共享和分配Redis的对象结构重用。</p>
        
        <p>所以，你能想象4096字节的页面实际上包含不同的较大值的不同部分组成的内存布局。不仅，但很多有足够大的值，我们交换到磁盘上，像一个1024K值，只有四分之一的内存页的大小，并有可能在同一页中，有其他的值，是不是很少使用。所以这个值WIL从未被换出的操作系统。这是实施应用程序级的虚拟内存在Redis的第一个原因。</p>
        
        <p>还有另一个，作为第一重要的。像一个列表或一组内存在一个复杂的对象是比磁盘上的序列相同的对象大10倍。也许你已经注意到如何Redis的磁盘上的快照该死的小Redis的记忆体使用相同的对象相比。发生这种情况，因为数据是在内存中时是指针，引用计数器和其他元数据。加入这个malloc的碎片，需要返回字对齐的内存块，你有一个清晰的画面会发生什么。因此，这意味着有10倍的内存和磁盘之间的I / O比，否则需要。</p>
        
        <h2>是有什么我可以做Redis的内存使用率降低？</h2>
        
        <p>是的，尝试编译32位的目标，如果您使用的是64位中。</p>
        
        <p>如果您正在使用Redis的> = 1.3，请尝试使用哈希数据类型，它可以节省大量的内存。</p>
        
        <p>如果您正在使用的值大于128字节的哈希或任何其他类型的尝试也降低RSS的使用（驻留集大小）：出口<code>EXPORT&#x000A;MMAP_THRESHOLD=4096</code></p>
        
        <h2>我空Redis的服务器，但INFO日志报告兆的内存在使用！</h2>
        
        <p>这种情况可能发生，它是完全没问题。Redis的对象是小C结构的分配和释放了很多次。这花费了很多的CPU，而不是被释放，释放的对象是成一个自由的清单，并在需要时可重新使用。此内存是完全为此做好准备予以重用的免费对象。</p>
        
        <h2>Redis的内存用完，会发生什么？</h2>
        
        <p>随着现代操作系统的malloc（）返回NULL是不常见的，通常服务器将开始交换和Redis的表演将是灾难性的，这样你就会知道它的使用Redis的服务器或得到更多的RAM。</p>
        
        <p>INFO命令在这几天的进展工作汇报金额内存Redis的使用，所以你可以写脚本监控Redis的服务器，检查情况危殆。</p>
        
        <p>您还可以使用配置文件“maxmemory”选项，把Redis的可以使用的内存限制。如果达到此限制Redis的错误写命令（但将继续接受只读命令）将开始回复。</p>
        
        <h2>Redis的使用更多的内存，运行在64位框？我可以使用64位系统的32位Redis的？</h2>
        
        <p>Redis的使用更大量的内存，当编译为64位的目标，特别是如果数据集是由许多小的键和值组成。例如，这样一个数据库，将消耗50 MB的RAM编译为32位的目标时，64位和80 MB！这是一个很大的区别。</p>
        
        <p>你可以运行在64位Linux和Mac OS X系统没有问题Redis的32位二进制文件。对于OS X使用，使32位。为Linux而不是确保您有 与libc6-dev-i386的安装，然后使用，使32位，如果你使用的是最新的Git版本。相反对Redis的<= 1.2.2，你必须编辑Makefile文件，并替换为“-M32”，“拱I386”。</p>
        
        <p>如果您的应用程序已经能够执行应用程序级分片，它是非常明智的运行Redis的32位的N个实例，对一个大的64位Redis的框（超过4GB的RAM），而不是一个单一的64位实例，因为这是更高效的内存。</p>
        
        <h2>在服务器启动时加载一个大的数据库需要多少时间？</h2>
        
        <p>只是一个正常的硬件上的例子：大约需要45秒恢复2 GB的一个相当标准的系统上的数据库，没有RAID。这可以给你某种顺序加载数据，当您重新启动服务器所需的时间幅度的感觉。</p>
        
        <h2>Background saving Linux下的fork（）的错误与失败，即使我很多自由RAM！</h2>
        
        <p>答案很简单: <code>echo 1 &gt; /proc/sys/vm/overcommit_memory</code> :)</p>
        
        <p>现在长：</p>
        
        <p>Redis的背景节能模式依赖于副本上写叉在现代操作系统的语义：Redis的叉（创建一个子进程），是一个母公司的精确副本。子进程转储数据库磁盘上，并最终退出。孩子在理论上，应该使用多少内存作为副本的父，但实际上由于副本上写大多数现代操作系统实施的语义的父母与子女的过程中，将分享共同的内存页。将复制的页面，只有当它在儿童或在父改变。因为理论上所有的网页可能会改变，而子进程是节约，Linux可以不事先告诉孩子将采取多大的内存，所以，如果overcommit_memory设置设置零叉将会失败，除非有尽可能多的可用RAM需要真正复制的结果，如果你有一个3 GB Redis的数据集和2 GB的可用内存将失败的所有父内存页。</p>
        
        <p>将overcommit_memory设置为1说Linux的放松和执行叉在一个更乐观的分配时尚，这确实是你想要的Redis的。</p>
        
        <p>一个很好的来源，以了解Linux的虚拟内存的工作，并为其他的替代overcommit_memory和overcommit_ratio这是从Red Hat杂志的经典之作，“了解虚拟内存”。</p>
        
        <h2>Redis的磁盘快照原子？</h2>
        
        <p>是，的再分配背景节能的过程始终是叉（2）编辑时，该服务器是执行命令之外，所以每一个命令报告是在RAM中的原子也从磁盘快照点的原子。</p>
        
        <h2>再分配是单线程的，我怎么能利用多CPU /核心？</h2>
        
        <p>简单地开始在不同的端口Redis的多个实例在同一台机器，并当作他们不同的服务器！鉴于Redis的是一个分布式数据库，无论如何，以扩大你需要考虑在多个计算单元。一个盒子，在某些时候可能没有足够的反正。</p>
        
        <p>一般键 - 值数据库是非常可伸缩的，因为不同的键可以在不同的服务器上保持独立的财产。</p>
        
        <p>在Redis的有客户端库等再分配RB（Ruby客户端），能够自动处理多个服务器，使用一致的散列。我们要实现在所有其他主要的客户端库的散列。如果你使用不同的语言，你可以实现自己，否则只是哈希键前设置/从一个给定的服务器。例如，想象有ñRedis的服务器，服务器-0-1，服务器，服务器- N。你要存储的关键“富”，什么是正确的服务器上，把“富”，以键均匀分布在不同的服务器吗？只是执行CRC = CRC32的（“富”），然后SERVERNUM = CRC％氮（师其余为N）。这将提供一个介于0和N-1的每一个关键。连接到这台服务器和存储的关键。得到相同。</p>
        
        <p>这是一个执行关键分区的基本途径，一致散列要好得多，这是Redis的1.0后为什么会被释放，我们会尽力落实在每一个被广泛使用的客户端库，Python和PHP开始（红宝石已经实现了这个支持） 。</p>
        
        <h2>我使用某种形式的密钥散列进行分区，但如何分类？</h2>
        
        <p>[的SortCommand分类]按你需要的所有重键是在你正试图进行排序的列表/套Redis的实例。为了做到这一点，我们开发了一个概念叫关键标签。一个关键的标记是一个特殊的模式，在一个关键，如果预设的，是唯一的哈希为了选择这个关键服务器的关键部分。例如以哈希关键的“foo”我只是执行整个字符串的CRC32校验，但如果这个键有一个字符的形式格局{...}我只哈希子串。因此，对于关键的“foo {呲}”例如密钥散列代码只会执行“呲”的CRC32。这种方式使用的关键标签，您可以确保相关键将存储Redis的，只是这一切键使用相同的密钥标记在同一实例。再分配RB已经实现了重点标记。</p>
        
        <h2>什么是键单一Redis的实例可以容纳的最大数量是多少？什么在列表中，设置元素的最大数量，有序集？</h2>
        
        <p>在Redis的理论可以处理多达32键，并在实践中进行测试，以处理每个实例的键至少有150万元。我们正以试验值越大。</p>
        
        <p>每个列表，设置的，责令设置，可容纳2<sup>32</sup>元素。</p>
        
        <p>其实Redis的内部准备允许多达2<sup>64</sup>元素，但当前的磁盘转储格式不支持此，目前有很多时间来解决这个问题，在未来甚至与128 GB的RAM，这是不可能达到2<sup>32</sup>元素。
        </p>
        
        <h2>什么再分配意味着什么呢？</h2>
        
        <p>再分配是指两件事情：</p>
        
        <ul>
        <li>这意味着远程字典服务器</li>
        <li>这是一个笑话（而只使用一个关系数据库Redis的服务器之间重新分配你的工作量上的字重新分配）</li>
        </ul>
        
        
        <h2>你为什么开始Redis的项目？</h2>
        
        <p>为了扩展<a href="http://lloogg.com" target="_blank">LLOOGG</a>。后，我得到了基本的服务器的工作，我很喜欢这个想法与其他人共享的工作，和Redis的一个开源项目了。</p>
      </article>
    </div>
    <div class='text' id='comments'>
      <div id='disqus_thread'></div>
      <script type='text/javascript'>
        //<![CDATA[
          var disqus_shortname = 'rediscn';
          
          /* * * DON'T EDIT BELOW THIS LINE * * */
          (function() {
            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
              dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
              (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
          })();
        //]]>
      </script>
      <a class='dsq-brlink' href='http://disqus.com'>
        Comments powered by
        <span class='logo-disqus'>
          Disqus
        </span>
      </a>
    </div>
    <script src='/js/foot.js'></script>
  </body>
</html>
